# -*- coding: utf-8 -*-
import webapp2
import exceptions

from Person import Person
from webapp2 import uri_for
from google.appengine.ext import ndb

transfer_dict = {u'No': False, u'Yes': True, '': False}
useless_actor = False
#TODO:разобраться, как удалять людей по одному через кнопку, напротив его имени.
# code_for_person_deleting_button = u"""
#         <form action="%s" method="post" id=%s>
#
#             <input type="submit" name="Удалить человека из списка">
#         </form>
#        """ % uri_for('delete_person', person_id)

class DisplayData(webapp2.RequestHandler):

    def get(self, *args, **kwargs):
        global useless_actor
        persons_query = sorted(list(Person.query()))
        types_of_candidates = ['Танцуют, поют, умеют что-то еще',
                           'Танцуют и поют',
                           'Танцуют и умею что-то еще, но не поют',
                           'Поют и умею что-то еще, но не танцуют',
                           'Только поют',
                           'Только танцуют',
                           'Не умеют ни петь, ни танцевать, но умеют что-то еще']
        types_that_consider_other_skills = ['Танцуют, поют, умеют что-то еще',
                                            'Танцуют и умею что-то еще, но не поют',
                                            'Поют и умею что-то еще, но не танцуют',
                                            'Не умеют ни петь, ни танцевать, но умеют что-то еще']

        ability_groups = {type: [] for type in types_of_candidates}

        total_persons = 0
        for person in persons_query:
            surname = person.surname
            name = person.name
            can_dance = person.can_dance
            can_sing = person.can_sing
            other_skills = person.other_skills
            person_id = surname + ' ' + name
            person_key = person.key.urlsafe()

            to_append = (person_id, other_skills, person_key)
            if can_sing and can_dance and other_skills:
                ability_groups['Танцуют, поют, умеют что-то еще'].append(to_append)
            if can_sing and can_dance and not other_skills:
                ability_groups['Танцуют и поют'].append(to_append)
            if not can_sing and can_dance and other_skills:
                ability_groups['Танцуют и умею что-то еще, но не поют'].append(to_append)
            if can_sing and not can_dance and other_skills:
                ability_groups['Поют и умею что-то еще, но не танцуют'].append(to_append)
            if not can_sing and can_dance and not other_skills:
                ability_groups['Только танцуют'].append(to_append)
            if can_sing and not can_dance and not other_skills:
                ability_groups['Только поют'].append(to_append)
            if not can_sing and not can_dance and other_skills:
                ability_groups['Не умеют ни петь, ни танцевать, но умеют что-то еще'].append(to_append)

            total_persons += 1

        self.response.write("""
        <html>
            <head>
                <title>Регистрация на кастинг спектакля</title>
            </head>
            <strong>
                На этой странице можно посмотреть список всех, кто зарегистрировался на спектакль,
                и зарегистрироваться самому.
            </strong>
        """)

        if total_persons == 0:
            self.response.write('<body><div style="font-family:cursive">'
                                '<h4>Пока никто не зарегистрировался, ты будешь первым.</h4>'
                                '</div> <ul>')
        else:
            self.response.write('<body>''<div style="font-family:cursive">'
                                '<h3>Список уже зарегистрировавшихся претендентов(%d всего):</h3>'
                                '</div><ul>'
                                % total_persons)

        for Type in types_of_candidates:
            if len(ability_groups[Type]) == 0:
                continue

            self.response.write('<li><h2> %s </h2></li><ul>' % Type)
            if Type in types_that_consider_other_skills:
                for person in sorted(ability_groups[Type]):
                    self.response.write(u'<li> %s (%s)' % (person[0], person[1]))
                    self.response.write(u'<form action="%s" method="post">'
                                        u'<input id="name" name="name" type="hidden" value="%s">\
                                        <input type="submit" value="Удалить" > </form>'
                                        u'</li>' %
                                        (uri_for('delete'), unicode(person[2])))
            else:
                for person in sorted(ability_groups[Type]):
                    self.response.write(u'<li> %s </li>' % (person[0]))
            self.response.write('</ul>')

        if useless_actor:  # если предыдущий введенный человек не обладал никакими навыками
            self.response.write('<div align = "center" style="font-family:cursive">'
                                '<h3><font color="red">'
                                'Для участия в спектакле необходимо обладать хоть какими-то навыками!'
                                ' </font></h3>'
                                '</div>')
            useless_actor = False

        self.response.write(u"""</ul>
        <form action="%s" method="post">
            <label for="person" font=><b>Расскажи нам про себя</b></label> <br>
            <label for="surname">Фамилия<br></label>
                <input id="surname" type="text" name="person_surname"> <br>
            <label for="name">Имя<br></label>
                <input id="name" type="text" name="person_name"><br><br>

            <input type="radio" name="can_dance" value="Yes">Я умею танцевать
            <input type="radio" name="can_dance" value="No">Я не умею танцевать<br>
            <input type="radio" name="can_sing" value="Yes">Я умею петь
            <input type="radio" name="can_sing" value="No">Я не умею петь<br><br>

            <label for="skills">А что еще ты умеешь?</label>
                <input id="other_skills" type="text" name="skills" size="40"><br>

            <input type="submit" name="Добавить">
        </form>
       """ % uri_for('add'))
        #
        # self.response.write("""<form action="%s" method="post"><input type="submit"
        #                     value="Удалить всех зарегистрировавшихся">
        #                     </form>"""
        #                     % uri_for('clear'))

        self.response.write('<div style="italic"><strong>'
                            'Обновите страницу, чтобы увидеть внесенные изменения.'
                            '</strong></div>'
                            '</body></html>')


class AddPerson(webapp2.RequestHandler):
    def __init__(self, *args, **kwargs):
        super(AddPerson, self).__init__(*args, **kwargs)

    def post(self, *args, **kwargs):
        global useless_actor
        try:
            name = unicode(self.request.get('person_name'))
            surname = unicode(self.request.get('person_surname'))
            can_dance = unicode(self.request.get('can_dance'))
            can_sing = unicode(self.request.get('can_sing'))
            other_skills = unicode(self.request.get('skills'))
        except exceptions.ValueError:
            self.redirect(uri_for('show'))
            return

        new_person = Person(surname=surname,
                            name=name,
                            can_dance=transfer_dict[can_dance],
                            can_sing=transfer_dict[can_sing],
                            other_skills=other_skills)
        if new_person.can_dance or new_person.can_sing or new_person.other_skills:
            new_person.put()
        else:
            useless_actor = True
        self.redirect(uri_for('show'))


class DeletePerson(webapp2.RequestHandler):
    def __init__(self, *args, **kwargs):
        super(DeletePerson, self).__init__(*args, **kwargs)

    def post(self, *args, **kwargs):
        try:
            delete_key = self.request.get('name')
        except exceptions.ValueError:
            self.redirect(uri_for('show'))
            return

        deleting_person = ndb.Key(urlsafe=delete_key)
        deleting_person.delete()
        self.redirect(uri_for('show'))


class ClearPersons(webapp2.RequestHandler):
    def __init__(self, *args, **kwargs):
        super(ClearPersons, self).__init__(*args, **kwargs)

    def post(self, *args, **kwargs):
        for key in Person.query().iter(keys_only=True):
            key.delete()
        self.redirect(uri_for('show'))